相關文章

*   [Arch 打包標準 (英)](/index.php/Arch_packaging_standards "Arch packaging standards")
*   [建立軟體包 (英)](/index.php/Creating_packages "Creating packages")
*   [核心編譯與 ABS (英)](/index.php/Kernel_Compilation_with_ABS "Kernel Compilation with ABS")
*   [PKGBUILD (英)](/index.php/PKGBUILD "PKGBUILD")
*   [makepkg (英)](/index.php/Makepkg "Makepkg")
*   [pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)")
*   [官方倉庫](/index.php/Official_repositories_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Official repositories (正體中文)")
*   [使用者倉庫](/index.php/Arch_User_Repository_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Arch User Repository (正體中文)")

**翻譯狀態：** 本文章是 [Arch_Build_System](/index.php/Arch_Build_System "Arch Build System") 的翻譯版本。最近一次的翻譯時間：2014-01-30。點擊[本連結](https://wiki.archlinux.org/index.php?title=Arch_Build_System&diff=0&oldid=284196)查看英文頁面之後的變更。

本文提供 Arch 組建系統的概覽，以及帶領初學者進行一遍操作。此文非完整的參考指南！如果需要更多資訊，請參考 man 手冊頁。

**註記:** ABS 一天同步一次，因此它和軟體庫上的版本稍微會有一點差距。

## Contents

*   [1 什麼是 Arch 組建系統？](#.E4.BB.80.E9.BA.BC.E6.98.AF_Arch_.E7.B5.84.E5.BB.BA.E7.B3.BB.E7.B5.B1.EF.BC.9F)
    *   [1.1 什麼是類似 ports 的系統?](#.E4.BB.80.E9.BA.BC.E6.98.AF.E9.A1.9E.E4.BC.BC_ports_.E7.9A.84.E7.B3.BB.E7.B5.B1.3F)
    *   [1.2 ABS 是類似的概念](#ABS_.E6.98.AF.E9.A1.9E.E4.BC.BC.E7.9A.84.E6.A6.82.E5.BF.B5)
    *   [1.3 ABS 快速瀏覽](#ABS_.E5.BF.AB.E9.80.9F.E7.80.8F.E8.A6.BD)
*   [2 我為什麼要用到 ABS？](#.E6.88.91.E7.82.BA.E4.BB.80.E9.BA.BC.E8.A6.81.E7.94.A8.E5.88.B0_ABS.EF.BC.9F)
*   [3 如何使用 ABS](#.E5.A6.82.E4.BD.95.E4.BD.BF.E7.94.A8_ABS)
    *   [3.1 安裝工具](#.E5.AE.89.E8.A3.9D.E5.B7.A5.E5.85.B7)
    *   [3.2 /etc/abs.conf](#.2Fetc.2Fabs.conf)
    *   [3.3 ABS 樹](#ABS_.E6.A8.B9)
        *   [3.3.1 下載 ABS 樹](#.E4.B8.8B.E8.BC.89_ABS_.E6.A8.B9)
    *   [3.4 /etc/makepkg.conf](#.2Fetc.2Fmakepkg.conf)
        *   [3.4.1 設定 /etc/makepkg.conf 的 PACKAGER 變數](#.E8.A8.AD.E5.AE.9A_.2Fetc.2Fmakepkg.conf_.E7.9A.84_PACKAGER_.E8.AE.8A.E6.95.B8)
            *   [3.4.1.1 顯示所有軟體包 (包含 AUR 軟體包)](#.E9.A1.AF.E7.A4.BA.E6.89.80.E6.9C.89.E8.BB.9F.E9.AB.94.E5.8C.85_.28.E5.8C.85.E5.90.AB_AUR_.E8.BB.9F.E9.AB.94.E5.8C.85.29)
            *   [3.4.1.2 只顯示軟體庫下的軟體包](#.E5.8F.AA.E9.A1.AF.E7.A4.BA.E8.BB.9F.E9.AB.94.E5.BA.AB.E4.B8.8B.E7.9A.84.E8.BB.9F.E9.AB.94.E5.8C.85)
    *   [3.5 建立組建目錄](#.E5.BB.BA.E7.AB.8B.E7.B5.84.E5.BB.BA.E7.9B.AE.E9.8C.84)
    *   [3.6 組建軟體包](#.E7.B5.84.E5.BB.BA.E8.BB.9F.E9.AB.94.E5.8C.85)
        *   [3.6.1 fakeroot](#fakeroot)

## 什麼是 Arch 組建系統？

Arch 組建系統 (Arch Build System)，縮寫為 **ABS**，是一套類似（BSD）ports 的系統，能從原始碼組建軟體並打包。[Pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)") 是 Arch 下特定的二進制安裝包管理工具（也包括管理那些從 ABS 組建的二進制安裝包），ABS 則是一組工具集，將原始碼編譯為一個可供安裝的 .pkg.tar.gz 軟體包。

### 什麼是類似 ports 的系統?

*Ports* 是 *BSD 下從原始碼組建軟體的自動化系統。系統使用一個 *port* 下載、解壓縮、修補、編譯並安裝給定的軟體。一個 *port* 差不多就是使用者電腦上的一個小目錄，以要安裝的相對應軟體命名，內部有幾個檔案指示如何從原始碼組建、安裝軟體。這讓安裝軟體這回事和在 port 目錄下輸入 `make` 或 `make install clean` 一樣簡單。

### ABS 是類似的概念

ABS 由目錄樹組成 (ABS tree)，位於 `/var/abs` 之下。這個樹包含了許多子目錄，每個子目錄有各自的分類與相對應的軟體包命名。這顆樹表示 (但不包含) 所有**官方 Arch 軟體**，可以透過 SVN 系統取得。您可以將這些以軟體包的名字命名的子目錄稱作 'ABS'，就如同這樣稱呼 'port' 一樣。這些 ABS (或子目錄) 不包含軟體包，也不包含原始碼，只有一份 [PKGBUILD](/index.php/PKGBUILD "PKGBUILD") 檔案 (有時還會有其他檔案)。PKGBUILD 只是一個 Bash 組建腳本 -- 這份文字檔包含編譯與打包指令，以及下載適合**來源**封存包的 URL。(ABS 最重要的組件就是 PKGBUILD。) 呼叫 ABS 的 [makepkg](/index.php/Makepkg "Makepkg") 指令後，首先軟體會被編譯，接著在組建目錄下**打包**。之後您便可以使用 [pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)") 這個 Arch Linux 軟體包管理員來安裝、升級、移除您的新軟體包。

### ABS 快速瀏覽

'ABS' 包含並依賴數個其他組件，因此可被當作這些組件的總稱；雖然在技術上並非完全準確，'ABS' 可以指以下工具所構成的完整工具集：

	ABS 樹

	ABS 目錄架構；(本地) 機器 `/�var/abs/` 目錄下的 SVN 階層。包含數個子目錄，以所有 `/etc/abs.conf` 下指定軟體庫中可用的官方 Arch Linux 軟體命名，但不存放軟體包本身。以 [pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)") 安裝 [abs](https://www.archlinux.org/packages/?name=abs) 軟體包，並執行 `abs` 腳本，這顆樹才會被建立。

	[PKGBUILD](/index.php/PKGBUILD "PKGBUILD")

	包含原始碼 URL、編譯與打包指令的 [Bash](/index.php/Bash "Bash") 腳本。

	[makepkg](/index.php/Makepkg "Makepkg")

	ABS shell 指令工具，會閱讀 PKGBUILD、自動下載並編譯原始碼，並根據 `makepkg.conf` 的 `PKGEXT` 行建立 `.pkg.tar*`。您也可以使用 makepkg 建立來自 [AUR](/index.php/AUR_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "AUR (正體中文)") 或第三方來源的自訂軟體包。(參閱[建立軟體包](/index.php/Creating_packages "Creating packages") wiki 文章。)

	[pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)")

	pacman 和 ABS 完全切割，但若需要的話，可以由 makepkg 呼叫或手動執行。用途為安裝、移除組建軟體包與抓取相依軟體包。

	[AUR](/index.php/Arch_User_Repository_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Arch User Repository (正體中文)")

	Arch 使用者倉庫和 ABS 基本上無關，但 (未受支援的) AUR PKGBUILD 可透過 makepkg 組建，編譯和打包軟體。與位於您本地機器上的 ABS 樹不同，AUR 基於網站介面。它包含數千個由使用者貢獻的 PKGBUILD，這些是無法從官方 Arch 軟體庫獲取的軟體。如果您需要組建官方 Arch 樹以外的軟體包，到 AUR 會有機會找得到。

## 我為什麼要用到 ABS？

Arch 組建系統被用來：

*   編譯或重新編譯軟體包，不論任何原因
*   若沒有可用的軟體包，可以從軟體原始碼建立並安裝新軟體包 (參閱[建立軟體包](/index.php/Creating_packages "Creating packages"))
*   已存在軟體包可以自訂以符合您的需求 (啟用或停用選項、修補程式)
*   使用您的編譯器旗標重新組建整套系統，「和 FreeBSD 一樣」 (例如使用 [pacbuilder](/index.php/Pacbuilder "Pacbuilder"))
*   乾淨的組建安裝您自訂的核心 (參閱[核心編譯](/index.php/Kernel_Compilation "Kernel Compilation"))
*   讓核心模組在您自訂的核心下可以運作
*   簡單編譯安裝 Arch 較新、較舊、測試或開發版本的軟體包，只需編輯 PKGBUILD 的版本號

ABS 並非 Arch Linux 下必需功能，但它是相當好用的原始碼編譯自動化工具。

## 如何使用 ABS

使用 abs 組建軟體包由以下步驟組成：

1.  用 [pacman](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)") 安裝 [abs](https://www.archlinux.org/packages/?name=abs) 軟體包。
2.  以 root 身分執行 `abs`，和 Arch Linux 伺服器同步以建立 ABS 樹。
3.  將組建檔案 (通常位於 `/var/abs/<倉庫>/<軟體包名稱>`) 複製到組建目錄。
4.  到組建目錄編輯 PKGBUILD (若想要/需要的話)，並執行 **makepkg**。
5.  根據 PKGBUILD 的指令，makepkg 將下載適當的原始碼壓縮包、解壓縮、若有指定則套用修補、根據 `makepkg.conf` 指定的 `CFLAGS` 編譯，最後將組建檔案壓縮為副檔名 `.pkg.tar.gz` 或 `.pkg.tar.xz` 的軟體包。
6.  簡單一步 `pacman -U <.pkg.tar.xz 檔案>` 完成安裝。軟體包移除也交給 pacman 負責。

### 安裝工具

要使用 ABS，首先需要從[官方軟體庫](/index.php/Official_repositories_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Official repositories (正體中文)")[安裝](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87) "Pacman (正體中文)") [abs](https://www.archlinux.org/packages/?name=abs)。

將會抓取 abs 同步腳本、各種組建腳本以及 [rsync](/index.php/Rsync "Rsync") (若沒有的話會以相依軟體安裝)。

在真正組建任何東西之前，您還需要基本的編譯工具。這些工具被收集於 [base-devel](https://www.archlinux.org/groups/x86_64/base-devel/) 這個[軟體群組](/index.php/Pacman_(%E6%AD%A3%E9%AB%94%E4%B8%AD%E6%96%87)#.E5.AE.89.E8.A3.9D.E8.BB.9F.E9.AB.94.E7.BE.A4.E7.B5.84 "Pacman (正體中文)")。用 pacman 安裝這個群組。

### /etc/abs.conf

以 root 身分編輯 `/etc/abs.conf`，將您想要的軟體庫包含近來。

移除適當軟體庫前面的 `!`。舉例來說：

```
REPOS=(core extra community !testing)

```

### ABS 樹

ABS 樹是 `/var/abs` 下的 SVN 目錄階層，長得像這樣：

```
| -- core/
|     || -- acl/
|     ||     || -- PKGBUILD
|     || -- attr/
|     ||     || -- PKGBUILD
|     || -- abs/
|     ||     || -- PKGBUILD
|     || -- autoconf/
|     ||     || -- PKGBUILD
|     || -- ...
| -- extra/
|     || -- acpid/
|     ||     || -- PKGBUILD
|     || -- apache/
|     ||     || -- PKGBUILD
|     || -- ...
| -- community/
|     || -- ...

```

ABS 樹的架構和軟體包資料庫的架構完全一模一樣：

*   第一層：軟體庫名稱
*   第二層：軟體包名稱的目錄
*   第三層：PKGBUILD (包含組建軟體包所需資訊) 和其他相關檔案 (修補程式，和其他組建軟體包所需檔案)

ABS 目錄下並沒有軟體包的原始碼。**PKGBUILD** 檔案包含了原始碼的下載 URL，在組建軟體包時才會下載過來。因此 abs 樹其實相當小。

#### 下載 ABS 樹

以 root 身分執行：

```
# abs

```

現在，您的 ABS 樹已經建立在 `/var/abs` 下。在 `/etc/abs.conf` 指定的軟體庫，在 ABS 樹下也出現相對應的分支。

abs 指令應該定期執行，以和官方軟體庫同步。單一的 ABS 軟體包檔案也可以用下列指令下載：

```
# abs <倉庫>/<軟體包>

```

這樣您在組建一份軟體包時，就不需要檢查整個 abs 樹。

### /etc/makepkg.conf

`/etc/makepkg.conf` 指定了全域環境變數與編譯器旗標，若您使用 SMP (對稱多處理) 系統，或打算做其他優化的話，可以編輯這個檔案。預設設定值會對 i686 和 x86_64 作優化，在這類型架構的單核 CPU 系統下運作良好。(預設值也適用於 SMP 機器，但編譯時只會使用一個核心/CPU -- 參閱 [makepkg.conf](/index.php/Makepkg.conf "Makepkg.conf")。)

#### 設定 /etc/makepkg.conf 的 PACKAGER 變數

`/etc/makepkg.conf` 的 PACKAGER 變數設定是選用但**強烈建議**的步驟。它可以快速偵測哪個軟體包是由您組建/安裝，而非官方維護者！使用來自 community 庫的 [expac](https://www.archlinux.org/packages/?name=expac) 可以輕易達成：

##### 顯示所有軟體包 (包含 AUR 軟體包)

```
$ grep myname /etc/makepkg.conf
PACKAGER="myname <myemail@myserver.com>"

```

```
$ expac "%n %p" | grep "myname" | column -t
archey3 myname
binutils myname
gcc myname
gcc-libs myname
glibc myname
tar myname

```

##### 只顯示軟體庫下的軟體包

這個範例只顯示存在於 `/etc/pacman.conf` 所定義軟體庫的軟體包：

```
$ . /etc/makepkg.conf; grep -xvFf <(pacman -Qqm) <(expac "%n\t%p" | grep "$PACKAGER$" | cut -f1)
binutils
gcc
gcc-libs
glibc
tar

```

### 建立組建目錄

建議另外建立一個組建目錄，作為實際編譯使用；您不應直接在 ABS 樹組建，動到 ABS 樹，否則在每次 ABS 升級時會有資料遺失 (被覆寫)。使用自己的家目錄是個好辦法，有些 Arch 使用者會偏好在 `/var/abs/` 下建立一個 'local' 目錄，由一般使用者擁有。

建立您的組建目錄。例如：

```
$ mkdir -p $HOME/abs

```

從 (`/var/abs/<倉庫>/<軟體包名稱>`) 樹複製 ABS 到組建目錄。

### 組建軟體包

在這個範例，我們將組建 *slim* 顯示管理員。

將 ABS 樹的 slim ABS 複製到組建目錄：

```
$ cp -r /var/abs/extra/slim/ ~/abs

```

切換到組建目錄：

```
$ cd ~/abs/slim

```

修改 PKGBUILD 可新增和移除組件的支援、做修補或更改軟體包版本 (選用)：

```
$ nano PKGBUILD

```

以一般使用者身分執行 makepkg (`-s` 選項會自動處理安裝相依性)：

```
$ makepkg -s

```

**註記:** 若出現缺少的 (make) 相依性，請記得，預設假定所有的 Arch Linux 系統已經安裝 [base](https://www.archlinux.org/groups/x86_64/base/) 群組。當使用 **makepkg** 組建時也假定已安裝 [base-devel](https://www.archlinux.org/groups/x86_64/base-devel/) 群組。參閱[#安裝工具](#.E5.AE.89.E8.A3.9D.E5.B7.A5.E5.85.B7)。

以 root 身分安裝：

```
# pacman -U slim-1.3.0-2-i686.pkg.tar.xz

```

這樣就完成了。您已經從原始碼組建了 slim，並用 pacman 安裝到您的系統，毫無瑕疵。軟體包移除也可以用 pacman 處理：`pacman -R slim`。

ABS 方法導入了方便性與自動化，也為組建與安裝函式維持完整的透明度和控制 (它們被包進 PKGBUILD 裡面)。

#### fakeroot

基本上，傳統方法 (一般包含 `./configure, make, make install` 步驟) 也會執行相同的步驟，但軟體會被安裝到 *fake root* (偽根目錄) 環境下。(*fake root* 只是組建目錄下一個子目錄，其作用和表現像是系統的根目錄。和 **fakeroot** 程式不同，makepkg 會建立一個假根目錄，並將編譯的二進位檔與相關檔案安裝進來，以 **root** 為檔案擁有者。) 這個 *fake root*，或包含編譯軟體的子目錄樹，接著會被壓縮為副檔名 `.pkg.tar.xz` 的封存檔，又稱「軟體包」。pacman 接著會解壓縮這個軟體包 (安裝) 至系統真正的根目錄 (`/`)。